#define _USE_MATH_DEFINES

#include <cstdio>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <cassert>
#include <stack>
#include <cstdlib>
#include <bitset>
#include <cmath>

#define forn(i,n) for (int i = 0; i < int(n); ++i)
#define pb push_back
#define all(a) a.begin(),a.end()
#define sz(a) int(a.size())
#define mp make_pair

using namespace std;

typedef long long li;
typedef long double ld;

typedef pair<int,int> pt;
#define ft first
#define sc second

const int INF = int(1e9);
const li INF64 = li(1e18);
const ld EPS = 1e-9;

//#define TASK_NAME ""

int n, x;
li d;

bool read() {
	if (!(cin >> n >> d >> x))
		return false;
	if (n == 0 && d == 0 && x == 0)
		return false;
	return true;
}

const int MOD = int(1e9) + 7;
const int N = 2005;

int dp[N][N];
int sum[N][N];

inline int mymod(int n) {
	while (n >= MOD)
		n -= MOD;
	while (n < 0)
		n += MOD;
	return n;
}

inline int binpow(int a, int b, int m) {
	li cur = a, res = 1;
	for (int i = 0; (1 << i) <= b; ++i) {
		if (b & (1 << i))
			res = (res * cur) % m;
		cur = (cur * cur) % m;
	}
	return int(res);
}

void solve() {
	forn(i, n + 1)
		forn(j, n + 1)
			dp[i][j] = 0;

	dp[0][0] = 1;

	for (int c = 1; c <= n; ++c) {
		int sum = x == 1 ? 0 : dp[0][c - 1];
		for (int i = 1; i <= n; ++i) {
			dp[i][c] = sum;
			sum = mymod(sum + dp[i][c - 1]);
			if (i + 1 >= x)
				sum = mymod(sum - dp[i + 1 - x][c - 1]);
		}
	}

	int res = 0;
	li cur = 1;

	forn(c, n + 1) {
		if (c > d)
			break;
		if (c) {
			cur = (cur * (d - c + 1)) % MOD;
			cur = (cur * binpow(c, MOD - 2, MOD)) % MOD;
		}

		res = (res + cur * dp[n][c]) % MOD;
	}

	cout << res << endl;
}

int main() {
#ifdef TASK_NAME
	freopen(TASK_NAME ".in", "r", stdin);
	freopen(TASK_NAME ".out", "w", stdout);
#endif

#ifdef _DEBUG
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	while (read())
		solve();

	return 0;
}